package com.ywj.jewelrymall.member;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

/**
 * 二、想要远程调用别的服务
 * 1）引入open-feign
 * 2）编写一个接口，告诉SpringCloud这个接口需要调用远程服务
 *    声明接口的每一个方法都是调用哪个远程访问的哪个请求
 * 3）开启远程调用功能
 *
 *
 *
 * 三、如何使用Nacos作为配置中心统一管理配置
 * 1）引入依赖
 *    <dependency>
 *       <groupId>com.alibaba.cloud</groupId>
 *       <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 *   </dependency>
 * 2）创建一个bootstrap.properties文件（springboot固定该文件名）
 *    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 *    spring.application.name=jewelrymall-member
 * 3）需要给配置中心默认添加一个叫 数据集(Data Id) jewelrymall-member.properties。默认规则，应用名.properties
 * 4）给 应用名.properties 添加任何配置
 * 5）动态获取配置——两个注解
 *    @RefreshScope : 动态获取并刷新配置
 *    @Value("${配置项的名}") : 获取到配置
 *    如果配置中心和当前应用的配置文件中都配置了相同的项，优先使用配置中心的配置
 *
 *  3.1 细节
 *  1）命名空间：配置隔离，基于环境、微服务互相隔离。默认——public（保留空间），默认新增的所有配置都在public空间
 *     a.开发、测试、生产  利用命名空间来做环境隔离。注意 在bootstrap.properties中，需要使用哪个命名空间下的配置
 *     spring.cloud.nacos.config.namespace=0eaa5fb6-a1d2-4e59-a6e1-26186cda06ae
 *     b.每一个微服务之间互相隔离配置，每一个微服务都创建自己的命名空间，只加载自己命名空间下的所有配置
 *  2）配置集：一组相关或者不相关的配置项的集合称为配置集。在系统中，一个配置文件通常就是一个配置集，包含了系统各个方面的配置。
 *  3）配置集ID：Nacos 中的某个配置集的 ID，类似文件名。Data ID —— jewelrymall-member.properties
 *  4）配置分组：Nacos 中的一组配置集，默认所有的配置集都属于 DEFAULT_GROUP。在bootstrap.properties中，可设置哪个分组，如618、1111、1212分组，
 *     spring.cloud.nacos.config.group=1111
 *
 *  每个微服务创建自己的命名空间，使用配置分组区分环境，dev、test、prod
 *
 *  3.2 同时加载多个配置集
 *  业务增多时，会将诸多配置值拆分到不同的文件中（数据源、框架），datasource/mybatis/other.yml，在bootstrap.properties中，
 *  spring.cloud.nacos.config.namespace=31098de9-fa28-41c9-b0bd-c754ce319ed4
 *  spring.cloud.nacos.config.ext-config[0].data-id=jewelrymall-datasource.yml
 *  spring.cloud.nacos.config.ext-config[0].refresh=true
 *  spring.cloud.nacos.config.ext-config[0].group=dev
 *  1）微服务任何配置信息、任何配置文件都可以放在配置中心中
 *  2）只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
 *  3）@Value、@ConfigurationProperties... 以前SpringBoot任何方法从配置文件中获取值，都能使用
 *    配置中心有的优先使用配置中心中的
 *
 *  优先读取配置中心，配置中心没有的(不指明分组的话 默认DEFAULT_GROUP) 读取配置文件
 *  最终微服务可只保留一个bootstrap.properties。开发期间为了方便 还是写在yml中；等上线后 写在nacos配置中心中
 */
@EnableFeignClients(basePackages = "com.ywj.jewelrymall.member.feign")       //开启远程调用feign功能。服务一启动 就会扫描basePackages下标注了@FeignClient注解的接口
//@ComponentScan("com.ywj.jewelrymall.member.feign")
@EnableDiscoveryClient    //开启服务注册与发现功能
@MapperScan("com.ywj.jewelrymall.member.dao")
@SpringBootApplication
public class JewelrymallMemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(JewelrymallMemberApplication.class, args);
    }

}
